home *** CD-ROM | disk | FTP | other *** search
/ Libris Britannia 4 / science library(b).zip / science library(b) / PROGRAMM / CC_C / 0574.ZIP / FIDOUNIX.C < prev    next >
C/C++ Source or Header  |  1986-08-12  |  13KB  |  544 lines

  1. static char *RCSid = "$Header: fidounix.c 1.3 86/07/31 23:03:06 rch Exp $";
  2.  
  3. /*
  4.     $Source: BOB/USENET/FIDO/fidounix.c%v $
  5.  
  6.        This file is part of the UN*X Gateway Fido/UNIX code.
  7.        This implements sending Fido messages to UNIX.
  8. */
  9.  
  10. /*
  11.  * $Log:    fidounix.c $
  12.  * Revision 1.3  86/07/31  23:03:06  rch
  13.  * Support stupid SEAdog hard and soft returns.
  14.  * 
  15.  * Revision 1.2  85/12/15  13:27:20  rch
  16.  * Added support for MAILER-DAEMON return of messages
  17.  * 
  18.  * Revision 1.1  85/12/10  01:45:50  rch
  19.  * Initial revision
  20.  * 
  21.  */
  22.  
  23. #include <stdio.h>
  24. #include <fcntl.h>
  25. #include <stat.h>
  26. #include <dos.h>
  27.  
  28. /* Fido Message structure */
  29. typedef struct {
  30.     char from[36];            /* who from */
  31.     char to[36];            /* who to */
  32.     char subj[72];            /* message subject */
  33.     char date[20];            /* creation date */
  34.     int times;            /* number of times read */
  35.     int dest;            /* destination node */
  36.     int orig;            /* originating node */
  37.     int cost;            /* actual cost of msg */
  38.     int orig_net;            /* originating net */
  39.     int dest_net;            /* destination net */
  40.     int caca[4];            /* extra space */
  41.     int reply;            /* thread to previous message */
  42.     int attr;            /* message type, below */
  43.     int up;                /* thread to next message */
  44. MSG, *MSG_PTR;
  45.  
  46. char *fgets(s, n, fp)
  47. char *s; FILE *fp;
  48. {
  49.     register c;
  50.     register char *cp;
  51.     char c1;
  52.  
  53.     cp = s;
  54.     while (--n > 0 && (c = getc(fp)) != EOF) {
  55.         if (c == '\r')
  56.             {
  57.             c1 = getc(fp);
  58.             if (c1 == '\r')
  59.                 c = '\n';
  60.             else
  61.                 ungetc (c1, fp);
  62.             }
  63.         if (c == 0x8d)
  64.             {
  65.             c = '\n';
  66.             c1 = getc(fp);
  67.             if (c1 != '\n')
  68.                 ungetc (c1, fp);
  69.             }
  70.         *cp++ = c;
  71.         if (c == '\n')
  72.             break;
  73.     }
  74.     *cp = 0;
  75.     if (c == EOF && cp == s)
  76.         return NULL;
  77.     return(s);
  78. }
  79.  
  80. main (argc, argv)
  81. int argc;
  82. char *argv[];
  83. {
  84.    FILE *input, *output;
  85.    char *tmp, buf[BUFSIZ], tmp1[1000], tmp2[100], filename[20], mailto[128];
  86.    char fm[36], *f, newname[20];
  87.    extern char *mktemp(), *gets();
  88.    long size, size1, lines;
  89.    int i, orphan;
  90.    MSG msg;
  91.  
  92. filedir ("*.MSG", 0, filename);
  93. while (filename[0] != '\0')
  94. {
  95.     printf ("%s ", filename);
  96.    orphan = 0;
  97.    if ((input = fopen (filename, "r+")) == NULL)
  98.       continue;
  99.    fread (&msg, 1, sizeof (MSG), input);
  100.    if (strcmp (msg.to, "Usenet") != 0)
  101.       {
  102.       if (strcmp (msg.from, "Usenet") != 0)
  103.      {
  104.          fclose (input);
  105.          printf ("not a message to or from 'Usenet'\n");
  106.          filedir ("*.MSG", 1, filename);
  107.          continue;
  108.      }
  109.       else
  110.      {
  111.      if (msg.attr & 64)
  112.         return_mail(&msg, filename, input);
  113.      else
  114.         {
  115.         printf ("is from Usenet and is ok\n");
  116.             fclose (input);
  117.         }
  118.      filedir ("*.MSG", 1, filename);
  119.      continue;
  120.      }
  121.       }
  122.    printf ("%s is a message to 'Usenet': ", filename);
  123.    if (msg.attr & 8)
  124.       {
  125.       printf ("already sent\n");
  126.       fclose (input);
  127.       filedir ("*.MSG", 1, filename);
  128.       continue;
  129.       }
  130.    msg.attr = 9;
  131.    if (fgets (mailto, BUFSIZ, input) == NULL)
  132.       {
  133.       fseek (input, 0L, 0);
  134.       fwrite (&msg, 1, sizeof (MSG), input);
  135.       fclose (input);
  136.       printf ("%s has no characters in it!\n", filename);
  137.       filedir ("*.MSG", 1, filename);
  138.       continue;
  139.       }
  140.    f = mailto;
  141.    while (*f != '\0')
  142.       if ((*f == 10) || (*f == 13) || (*f == 138) || (*f == 141))
  143.      *f = '\0';
  144.       else
  145.      ++f;
  146.    size = 0;
  147.    tmp = mktemp ("junkXXXX.XX");
  148.    output = fopen (tmp, "w");
  149.    get_date ("%w %n %d          %Y", tmp2);
  150.    get_time ("%h:%m:%s", &tmp2[11]);
  151.    strcpy (fm, msg.from);
  152.    f = fm;
  153.    while (*f != '\0')
  154.       if (*f == ' ')
  155.      *f++ = '_';
  156.       else
  157.      f++;
  158.  
  159.    sprintf (tmp1, ">From %d!%d!%s  %s remote from spark\n", msg.orig_net,
  160.       msg.orig, fm, tmp2);
  161.    fprintf (output, tmp1);
  162.    size += strlen (tmp1);
  163.    sprintf (tmp1, "From: spark!%d!%d!%s\n", msg.orig_net, msg.orig, fm);
  164.    fprintf (output, tmp1);
  165.    size += strlen (tmp1);
  166.    sprintf (tmp1, "To: %s", mailto);
  167.    fprintf (output, "%s\n", tmp1);
  168.    size += strlen (tmp1) + 1;
  169.    sprintf (tmp1, "Subject: %s\n", msg.subj);
  170.    fprintf (output, "%s\n", tmp1);
  171.    size += strlen (tmp1) + 1;
  172.  
  173.    while (fgets (buf, BUFSIZ, input) != NULL)
  174.       {
  175.       fprintf (output, "%s", buf);
  176.       size += strlen (buf);
  177.       }
  178.    fclose (output);
  179.    fseek (input, 0L, 0);
  180.    fwrite (&msg, 1, sizeof (MSG), input);
  181.    fclose (input);
  182.    sprintf (tmp1, "#! MAIL-%s %ld\r\n", mailto, size);
  183.    printf ("Sending mail to %s\n", mailto);
  184.    filecopy (tmp, tmp1);
  185.    unlink (tmp);
  186.    unlink (filename);
  187.    filedir ("*.MSG", 1, filename);
  188. }
  189. }
  190.  
  191. filecopy (oldname, str)
  192. char *oldname, *str;
  193. {
  194.     int in, out, c;
  195.     char buf[BUFSIZ];
  196.     char newname[100];
  197.  
  198.     strcpy (newname, "C:/FIDO/VAXINE/REPLY.1");
  199.     in = open (oldname, O_RDONLY);
  200.     out = open (newname, O_CREAT+O_WRONLY+O_APPEND);
  201.     write (out, str, strlen (str));
  202.     while ((c = read (in, buf, BUFSIZ)) == BUFSIZ)
  203.         write (out, buf, BUFSIZ);
  204.     if (c != 0)
  205.         write (out, buf, c);
  206.     close (in);
  207.     close (out);
  208. }
  209.  
  210. /*
  211.         date.c
  212.  
  213.         Author: Bob Hartman
  214.         Date:   6-5-85
  215.  
  216.         This file implements a standardized date routine which is
  217.         callable from Manx AZTEC C-86 compiler.  The format string
  218.         determines the way the date is to be formatted as follows:
  219.  
  220.                 %n - 3 character month name
  221.                 %N - Full month name
  222.                 %m - Month as 2 digits (zero filled if necessary)
  223.                 %d - Day as 2 digits (zero filled if necessary)
  224.         %w - 3 character day of week name
  225.         %W - Full day of week name
  226.                 %y - Year as 2 digits
  227.                 %Y - Year as 4 digits
  228.  
  229.                 A % not followed by one of the above is ignored.
  230.                 All other characters in the format specifier are
  231.                 copied to the output string.
  232. */
  233.  
  234. /* Character used to delimit format specifiers in format strings */
  235. #define ESCAPE_CHAR     '%'
  236. #define DOSINT   0x21
  237.  
  238. /* Month names for date() function */
  239. static char *_months[12] = {
  240.         "January", "February", "March",     "April",   "May",      "June",
  241.         "July",    "August",   "September", "October", "November", "December"
  242. };
  243.  
  244. /* Day of week names for date() function */
  245. static char *_days[7] = {
  246.    "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"
  247. };
  248.  
  249.  
  250. /*
  251.         date (fmt, d)
  252.         char *fmt;
  253.         char *d;
  254.  
  255.         returns in d, the current date in the form specified by the fmt string
  256. */
  257.  
  258. get_date (fmt, d)
  259. register char *fmt;
  260. register char *d;
  261. {
  262.     union REGS    inregs, outregs;
  263.     char    temp[5];        /* To hold date so it can be processed again */
  264.     int w, y, m, d1; 
  265.         
  266.     inregs.x.ax = 0x2a00;
  267.     (void) sysint (DOSINT, &inregs, &outregs);
  268.     w = outregs.h.al;
  269.     y = outregs.x.cx;
  270.     m = outregs.h.dh;
  271.     d1 = outregs.h.dl;
  272.     
  273.     /* Now go through the format string */
  274.     while (*fmt != '\0')
  275.         {
  276.         if (*fmt != ESCAPE_CHAR)
  277.             *d++ = *fmt;
  278.         else
  279.             {
  280.             switch (*(++fmt))
  281.                 {
  282.                 case 'n':
  283.                     sprintf (d, "%.3s", _months[m - 1]);
  284.                     d += 3;
  285.                     break;
  286.                 case 'N':
  287.                     sprintf (d, "%s", _months[m - 1]);
  288.                     d += strlen (d);
  289.                     break;
  290.                 case 'm':
  291.                     sprintf (d, "%02d", m);
  292.                     d += 2;
  293.                     break;
  294.                 case 'd':
  295.                     sprintf (d, "%02d", d1);
  296.                     d += 2;
  297.                     break;
  298.                 case 'w':
  299.                     sprintf (d, "%.3s", _days[w]);
  300.                     d += 3;
  301.                     break;
  302.                 case 'W':
  303.                     sprintf (d, "%s", _days[w]);
  304.                     d += strlen (d);
  305.                     break;
  306.                 case 'y':
  307.                     sprintf (temp, "%04d", y);
  308.                     sprintf (d, "%.2s", temp+2);
  309.                     d += 2;
  310.                     break;
  311.                 case 'Y':
  312.                     sprintf (d, "%04d", y);
  313.                     d += 4;
  314.                     break;
  315.                 default:
  316.                     *d++ = *fmt;
  317.                 }
  318.             }
  319.         ++fmt;
  320.         }
  321.     *d = '\0';      /* Just to be sure that it is null terminated */
  322. }
  323.  
  324. /*
  325.         time.c
  326.  
  327.         Author: Robert Hartman
  328.         Date:   6-5-85
  329.  
  330.         This file implements a standardized time routine which is
  331.         callable from Manx AZTEC C-86 compiler.  The format string
  332.         determines the way the time is to be formatted as follows:
  333.  
  334.                 %h - 2 digits for hours (24 hour clock)
  335.                 %H - 2 digits for hours (12 hour clock)
  336.                 %m - 2 digits for minutes
  337.                 %s - 2 digits for seconds
  338.                 %t - 2 digits for hundredths of a second
  339.                 %i - am/pm indicator
  340.                 %I - AM/PM indicator
  341.  
  342.                 A % not followed by one of the above is ignored.
  343.                 All other characters in the format specifier are
  344.                 copied to the output string.
  345. */
  346.  
  347.  
  348. /* Character used to delimit format specifiers in format strings */
  349. #define ESCAPE_CHAR     '%'
  350. #define DOSINT   0x21
  351.  
  352. /*
  353.         time (fmt, t)
  354.         char *fmt;
  355.         char *t;
  356.  
  357.         returns in t, the current time in the form specified by the fmt string
  358. */
  359.  
  360. get_time (fmt, t)
  361. register char *fmt;
  362. register char *t;
  363. {
  364.     union REGS    inregs, outregs;
  365.     int h, m, s, ms;
  366.  
  367.     inregs.x.ax = 0x2c00;
  368.     (void) sysint (DOSINT, &inregs, &outregs);
  369.     h = outregs.h.ch;
  370.     m = outregs.h.cl;
  371.     s = outregs.h.dh;
  372.     ms = outregs.h.dl;
  373.     /* Now go through the format string */
  374.     while (*fmt != '\0')
  375.         {
  376.         if (*fmt != ESCAPE_CHAR)
  377.             *t++ = *fmt;
  378.         else
  379.             {
  380.             switch (*(++fmt))
  381.                 {
  382.                 /* hours (24 hour clock) */
  383.                 case 'h':
  384.                     sprintf (t, "%02d", h);
  385.                     t += 2;
  386.                     break;
  387.                 /* hours (12 hour clock) */
  388.                 case 'H':
  389.                     sprintf (t, "%02d", (h % 12) ?    (h % 12) : 12);
  390.                     t += 2;
  391.                     break;
  392.                 /* minutes */
  393.                 case 'm':
  394.                     sprintf (t, "%02d", m);
  395.                     t += 2;
  396.                     break;
  397.                 /* seconds */
  398.                 case 's':
  399.                     sprintf (t, "%02d", s);
  400.                     t += 2;
  401.                     break;
  402.                 /* hundredths of a second */
  403.                 case 't':
  404.                     sprintf (t, "%02d", ms);
  405.                     t += 2;
  406.                     break;
  407.                 /* am/pm indicator */
  408.                 case 'i':
  409.                     sprintf (t, "%s", (h < 12) ? "am" : "pm");
  410.                     t += 2;
  411.                     break;
  412.                 /* AM/PM indicator */
  413.                 case 'I':
  414.                     sprintf (t, "%s", (h < 12) ? "AM" : "PM");
  415.                     t += 2;
  416.                     break;
  417.                 default:
  418.                     *t++ = *fmt;
  419.                 }
  420.             }
  421.         ++fmt;
  422.         }
  423.     *t = '\0';      /* Just to be sure that it is null terminated */
  424. }
  425.  
  426. filedir (name, times, ret_str)
  427. char *name;
  428. int times;
  429. char *ret_str;
  430. {
  431.     static struct {
  432.     char rsvd[21];
  433.     char attr;
  434.     long ftime;
  435.     long fsize;
  436.     char fname[13];
  437.     } 
  438.     sbuf;
  439.  
  440.  
  441.     bdos (0x1a, &sbuf);
  442.     if (times == 0) {
  443.         if (dos (0x4e, 0, ~ST_VLABEL, name, 0, 0) == -1) 
  444.             sbuf.fname[0] = '\0';
  445.         strcpy (ret_str, sbuf.fname);
  446.     }
  447.     else {
  448.         if (dos (0x4f, 0, ~ST_VLABEL, name, 0, 0) == -1) 
  449.             sbuf.fname[0] = '\0';
  450.         strcpy (ret_str, sbuf.fname);
  451.     }
  452. }
  453.  
  454. return_mail(msg, filename, input)
  455. MSG_PTR msg;
  456. char *filename;
  457. FILE *input;
  458. {
  459.    FILE *output;
  460.    char *tmp, buf[BUFSIZ], tmp1[1000], tmp2[100], mailto[128];
  461.    char fm[36], *f, newname[20];
  462.    extern char *mktemp(), *gets();
  463.    long size, size1, lines;
  464.    int i, orphan;
  465.  
  466.    printf ("is from Usenet and is an orphan: ");
  467.    for (;;)
  468. {
  469.    if (fgets (mailto, BUFSIZ, input) == NULL)
  470.       {
  471.       fseek (input, 0L, 0);
  472.       fwrite (&msg, 1, sizeof (MSG), input);
  473.       printf ("no From: line\n");
  474.       fclose (input);
  475.       return;
  476.       }
  477.    if (strncmp (mailto, "From: ", 6) == 0)
  478.       break;
  479. }
  480.    f = &mailto[6];
  481.    f = mailto;
  482.    while (*f != '\0')
  483.       if ((*f == 10) || (*f == 13) || (*f == 138) || (*f == 141))
  484.      *f = '\0';
  485.       else
  486.      ++f;
  487.    size = 0;
  488.    tmp = mktemp ("junkXXXX.XX");
  489.    output = fopen (tmp, "w");
  490.    get_date ("%w %n %d          %Y", tmp2);
  491.    get_time ("%h:%m:%s", &tmp2[11]);
  492.    strcpy (fm, msg->from);
  493.    f = fm;
  494.    while (*f != '\0')
  495.       if (*f == ' ')
  496.      *f++ = '_';
  497.       else
  498.      f++;
  499.  
  500.    sprintf (tmp1, ">From MAILER-DAEMON  %s remote from spark\n", tmp2);
  501.    fprintf (output, tmp1);
  502.    size += strlen (tmp1);
  503.    sprintf (tmp1, "From: spark!MAILER-DAEMON\n");
  504.    fprintf (output, tmp1);
  505.    size += strlen (tmp1);
  506.    sprintf (tmp1, "To: %s", &mailto[6]);
  507.    fprintf (output, "%s\n", tmp1);
  508.    size += strlen (tmp1)+1;
  509.    sprintf (tmp1, "Subject: Returned mail - Fido node non-existant\n");
  510.    fprintf (output, "%s\n", tmp1);
  511.    size += strlen (tmp1);
  512.    sprintf (tmp1, "   ----- Transcript of session follows -----\n");
  513.    fprintf (output, "%s", tmp1);
  514.    size += strlen (tmp1);
  515.    sprintf (tmp1, "\n     %d!%d - Fido node non-existant\n\n", msg->dest_net, msg->dest);
  516.    fprintf (output, "%s", tmp1);
  517.    size += strlen (tmp1);
  518.    sprintf (tmp1, "   ----- Unsent message follows -----\n\n");
  519.    fprintf (output, "%s", tmp1);
  520.    size += strlen (tmp1);
  521.  
  522.    fprintf (output, "%s\n", mailto);
  523.    size += strlen (mailto)+1;
  524.    sprintf (tmp1, "To: %d!%d!%s\n", msg->dest_net, msg->dest, msg->to);
  525.    fprintf (output, "%s", tmp1);
  526.    size += strlen (tmp1);
  527.    while (fgets (buf, BUFSIZ, input) != NULL)
  528.       {
  529.       fprintf (output, "%s", buf);
  530.       size += strlen (buf);
  531.       }
  532.    fclose (output);
  533.    fseek (input, 0L, 0);
  534.    fwrite (&msg, 1, sizeof (MSG), input);
  535.    fclose (input);
  536.    sprintf (tmp1, "#! MAIL-%s %ld\r\n", &mailto[6], size);
  537.    printf ("Sending mail back to %s\n", &mailto[6]);
  538.    filecopy (tmp, tmp1);
  539.    unlink (tmp);
  540.     unlink (filename);
  541. }
  542.  
  543.